package br.com.sgc.permissao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public enum Role {
	
	/********* CLINICAS ************/
	Sistema_SGC_Clinica_Atualizar("SGC","Clínica","Atualizar"),
	Sistema_SGC_Clinica_Salvar("SGC","Clínica","Salvar"),
	
	
	/********* SEGURANCA ***********/
	Sistema_Usuarios_Seguranca_Salvar("Segurança","Usuário","Salvar"), 
	Sistema_Usuarios_Seguranca_Excluir("Segurança","Usuário","Excluir"), 
	Sistema_Usuarios_Seguranca_Atualizar("Segurança","Usuário","Atualizar"), 
	Sistema_Usuarios_Seguranca_Listar("Segurança","Usuário","Listar"),

	/********* PERFIL ***********/
	Sistema_Usuarios_Perfil_Salvar("Segurança","Perfil","Salvar"),
	Sistema_Usuarios_Perfil_Excluir("Segurança","Perfil","Excluir"),
	Sistema_Usuarios_Perfil_Atualizar("Segurança","Perfil","Atualizar"),
	Sistema_Usuarios_Perfil_Listar("Segurança","Perfil","Listar"),

	/********* AUDITORIA ***********/
	Sistema_Usuarios_Auditoria_Listar("Segurança","Auditoria","Listar"),
	

	/********* ENDERECO ***********/
	Sistema_Geral_Endereco_Excluir("Geral","Endereço","Excluir"),
	Sistema_Geral_Endereco_Atualizar("Geral","Endereço","Atualizar"),
	Sistema_Geral_Endereco_Salvar("Geral","Endereço","Salvar"),
	Sistema_Geral_Endereco_Listar("Geral","Endereço","Listar"),
	
	/********* PACIENTE ***********/
	Sistema_SGC_Paciente_Excluir("SGC","Paciente","Excluir"),
	Sistema_SGC_Paciente_Atualizar("SGC","Paciente","Atualizar"),
	Sistema_SGC_Paciente_Salvar("SGC","Paciente","Salvar"),
	Sistema_SGC_Paciente_Listar("SGC","Paciente","Listar"),
	
	/********* MEDICO ***********/
	Sistema_SGC_Medico_Excluir("SGC","Médico","Excluir"),
	Sistema_SGC_Medico_Atualizar("SGC","Médico","Atualizar"),
	Sistema_SGC_Medico_Salvar("SGC","Médico","Salvar"),
	Sistema_SGC_Medico_Listar("SGC","Médico","Listar"),
	
	/********* ESPECIALIDADE ***********/
	Sistema_SGC_Especialidade_Excluir("SGC","Especialidade","Excluir"),
	Sistema_SGC_Especialidade_Atualizar("SGC","Especialidade","Atualizar"),
	Sistema_SGC_Especialidade_Salvar("SGC","Especialidade","Salvar"),
	Sistema_SGC_Especialidade_Listar("SGC","Especialidade","Listar"),
	
	/********* PESSOA FISICA ***********/
	Sistema_SGC_Tratamento_Excluir("SGC","Tratamento","Excluir"),
	Sistema_SGC_Tratamento_Atualizar("SGC","Tratamento","Atualizar"),
	Sistema_SGC_Tratamento_Salvar("SGC","Tratamento","Salvar"),
	Sistema_SGC_Tratamento_Listar("SGC","Tratamento","Listar"),

	
	/********* PLANOS DE SAUDE ***********/
	Sistema_SGC_Plano_Saude_Excluir("SGC","Plano de Saúde","Excluir"),
	Sistema_SGC_Plano_Saude_Atualizar("SGC","Plano de Saúde","Atualizar"),
	Sistema_SGC_Plano_Saude_Salvar("SGC","Plano de Saúde","Salvar"),
	Sistema_SGC_Plano_Saude_Listar("SGC","Plano de Saúde","Listar"),
	
	
	/********* FUNCIONARIO ***********/
	Sistema_RH_Funcionario_Salvar("RH","Funcionário","Salvar"),
	Sistema_RH_Funcionario_Atualizar("RH","Funcionário","Atualizar"),
	Sistema_RH_Funcionario_Excluir("RH","Funcionário","Excluir"),
	Sistema_RH_Funcionario_Listar("RH","Funcionário","Listar"),
	
	/********* CARGO ***********/
	Sistema_RH_Cargo_Excluir("RH","Cargo","Excluir"),
	Sistema_RH_Cargo_Atualizar("RH","Cargo","Atualizar"),
	Sistema_RH_Cargo_Salvar("RH","Cargo","Salvar"),
	Sistema_RH_Cargo_Listar("RH","Cargo","Listar"),
	
	/********* HORARIO ***********/
	Sistema_RH_Horario_Excluir("RH","Horário de Atendimento","Excluir"),
	Sistema_RH_Horario_Atualizar("RH","Horário de Atendimento","Atualizar"),
	Sistema_RH_Horario_Salvar("RH","Horário de Atendimento","Salvar"),
	Sistema_RH_Horario_Listar("RH","Horário de Atendimento","Listar"),
	
	/********* FUNCAO ***********/
	Sistema_RH_Funcao_Excluir("RH","Função","Excluir"),
	Sistema_RH_Funcao_Atualizar("RH","Função","Atualizar"),
	Sistema_RH_Funcao_Salvar("RH","Função","Salvar"),
	Sistema_RH_Funcao_Listar("RH","Função","Listar"),
	
	/********* PARAMETRO ***********/
	Sistema_Geral_Parametro_Atualizar("Geral","Parâmetro","Atualizar"),
	Sistema_Geral_Parametro_Salvar("Geral","Parâmetro","Salvar"),
	Sistema_Geral_Parametro_Visualizar("Geral","Parâmetro","Visualizar"),
	
	/********* AGENDA ***********/
	Sistema_SGC_Agenda_Cadastrar_Consulta("Geral","Agenda","Cadastrar Consulta"),
	

	/************************************************************************ MODULO IMPRESSÃO *************************************************/
	Sistema_Impressao_Impressao_Documentos("Geral","Impressão","Impressão de Documentos"), 
	
	Sistema_Financeiro_Fluxo_Caixa_Salvar("Financeiro", "Fluxo de Caixa", "Fechar Caixa"),
	Sistema_Financeiro_Fluxo_Caixa_Listar("Financeiro", "Fluxo de Caixa", "Listar"),
	Sistema_Financeiro_Fluxo_Caixa_Reabrir("Financeiro", "Fluxo de Caixa", "Reabrir Caixa"),
	
	Sistema_Financeiro_Forma_Pagamento_Salvar("Financeiro", "Formas de Pagamento", "Salvar"),
	Sistema_Financeiro_Forma_Pagamento_Listar("Financeiro", "Formas de Pagamento", "Listar"),
	Sistema_Financeiro_Forma_Pagamento_Atualizar("Financeiro", "Formas de Pagamento", "Atualizar"),
	
	Sistema_Financeiro_Pedido_Compra_Listar("PDV","Compras","Listar"),
	Sistema_Financeiro_Pedido_Compra_Salvar("PDV","Compras","Salvar"),
	Sistema_Financeiro_Pedido_Compra_Fechar("PDV","Compras","Fechar Compra em Aberto"),
	Sistema_Financeiro_Pedido_Compra_Cancelar("PDV","Compras","Cancelar Compra"),
	
	
	Sistema_Financeiro_Contas_Pagar_Listar("Financeiro","Contas a Pagar","Listar"),
	Sistema_Financeiro_Contas_Pagar_Salvar("Financeiro","Contas a Pagar","Salvar"),
	Sistema_Financeiro_Contas_Pagar_Baixar_Pagamento("Financeiro","Contas a Pagar","Quitar Pagamento em Aberto"),
	
	Sistema_Financeiro_Pedido_Venda_Listar("PDV","Vendas","Listar"),
	Sistema_Financeiro_Pedido_Venda_Salvar("PDV","Vendas","Salvar"),
	Sistema_Financeiro_Pedido_Venda_Fechar("PDV","Vendas","Fechar Venda em Aberto"),
	Sistema_Financeiro_Pedido_Venda_Cancelar("PDV","Vendas","Cancelar Venda"),
	
	Sistema_Financeiro_Contas_Receber_Listar("Financeiro","Contas a Receber","Listar"),
	Sistema_Financeiro_Contas_Receber_Salvar("Financeiro","Contas a Receber","Salvar"),
	Sistema_Financeiro_Contas_Receber_Baixar_Pagamento("Financeiro","Contas a Receber","Quitar Pagamento em Aberto")
	;

	private String modulo;
	private String displayName;
	private String aplicacao;

	/**
	 * Considerar aplica��o, m�dulo e displayname passados como par�metro
	 * @param modulo
	 * @param displayName
	 */
	private Role( String aplicacao, String modulo, String displayName) {
		this.modulo = modulo;
		this.displayName = displayName;
		this.aplicacao = aplicacao;
	}
	
	public String getModulo() {
		return modulo;
	}

	public void setModulo(String modulo) {
		this.modulo = modulo;
	}


	public void setDisplayName(String displayName) {
		this.displayName = displayName;
	}

	public String getDisplayName() {
		return displayName;
	}
	
	
	public String getAplicacao() {
		return aplicacao;
	}

	public void setAplicacao(String aplicacao) {
		this.aplicacao = aplicacao;
	}

	public static Role findRole(String displayName){
		Role r = null;
		for(Role role: Role.values()){
			if(role.name().equals(displayName)){
				r = role;
				break;
			}
		}
		return r;
	}
	
	public static Map<String, Role> getAplicacoes(){
		Map<String, Role> mapModule = new TreeMap<String, Role>();
		for(Role role: Role.values()) {
			mapModule.put(role.aplicacao, role);
		}
		return mapModule; 
	}
	
	public static Map<String, Role> getModulos(){
		Map<String, Role> mapModule = new TreeMap<String, Role>();
		for(Role role: Role.values()) {
			mapModule.put(role.modulo, role);
		}
		return mapModule; 
	}
	
	public static List<Role> getRolesByAplicacao(String aplicacao){
		Map<String, Role> mapModule = new TreeMap<String, Role>();
		List<Role> roles = new ArrayList<Role>();
		for(Role role: Role.values()){
			if(role.aplicacao.equals(aplicacao)) {
				mapModule.put(role.modulo, role);
			}
		}
		roles.addAll(mapModule.values());
		Collections.sort(roles, new RoleComparator());
		return roles;
	}
	
	public static List<Role> getRolesByModulo(String modulo){
		List<Role> roles = new ArrayList<Role>();
		for(Role role: Role.values()){
			if(role.modulo.equals(modulo)) {
				roles.add(role);
			}
		}
		Collections.sort(roles, new RoleComparator());
		return roles;
	}
	
	public static String getModuloByRoleAplicacao(Role roleAplicacao){
		String modulo = null;
		for(Role role: Role.values()) {
			if(role.modulo.equals(roleAplicacao.getModulo())){
				modulo = role.modulo;
			}
			
		}
		return modulo; 
	}
	
	public static String getModuloByRole(Role roleModulo){
		String modulo = null;
		for(Role role: Role.values()) {
			if(role.modulo.equals(roleModulo.getModulo())){
				modulo = role.modulo;
			}
			
		}
		return modulo; 
	}
	
	public static Map<String,Role> aplicacoesByPerfil(String[] permissoesArray) {
		Map<String, Role> mapModule = new TreeMap<String, Role>();
			
		for(String permissao: permissoesArray){
			Role role = findRole(permissao);
			mapModule.put(role.aplicacao, role);
		}
		return mapModule;
	}

	public static Map<String,Role> modulosByPerfil(String[] permissoesArray) {
		Map<String, Role> mapModule = new TreeMap<String, Role>();
			
		for(String permissao: permissoesArray){
			Role role = findRole(permissao);
			mapModule.put(role.modulo, role);
		}
		return mapModule;
	}

	public static List<Role> getRolesByAplicacaoPerfil(String aplicacao, String permissoes){
		Map<String, Role> mapModule = new TreeMap<String, Role>();
		List<Role> roles = new ArrayList<Role>();
		for(Role role: Role.values()){
			if(role.aplicacao.equals(aplicacao) && permissoes.contains(role.name())) {
				mapModule.put(role.modulo, role);
			}
		}
		roles.addAll(mapModule.values());
		Collections.sort(roles, new RoleComparator());
		return roles;
	}
	
	public static List<Role> getRolesByModuloPerfil(String modulo, String permissoes) {
		List<Role> roles = new ArrayList<Role>();
		for(Role role: Role.values()){
			if(role.modulo.equals(modulo) && permissoes.contains(role.name())) {
				roles.add(role);
			}
		}
		Collections.sort(roles, new RoleComparator());
		return roles;
	}
	
}
